package top.lingchen.spring5.testdemo;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import top.lingchen.spring5.autowire.Emp;
import top.lingchen.spring5.bean.Orders;
import top.lingchen.spring5.collectiontype.Book;
import top.lingchen.spring5.collectiontype.Course;
import top.lingchen.spring5.collectiontype.Stu;

/**
 * @Author 凌宸
 * @create 2021-11-28 下午 7:04
 * @Description
 * @Version 1.0
 */
public class TestSpring5Demo1 {
    @Test
    public void testCollections(){
        ApplicationContext con = new ClassPathXmlApplicationContext("bean1.xml");
        Stu stu = con.getBean("stu", Stu.class);
        stu.show();
        /**
         * [Java 课程, MySQL 课程, MyBatis 课程]
         * [张三, 张小三, 法外狂徒张三]
         * {JAVA=java, PHP=php, CPP=c++}
         * [Spring, SpringMVC, SpringBoot2.x]
         */
    }

    @Test
    public void testCollection2(){
        ApplicationContext con = new ClassPathXmlApplicationContext("bean2.xml");
        Book book1 = con.getBean("book", Book.class);
        Book book2 = con.getBean("book", Book.class);
        System.out.println(book1);
        System.out.println(book2);
        /**
         * top.lingchen.spring5.collectiontype.Book@103f852
         * top.lingchen.spring5.collectiontype.Book@587c290d
         */
//        book1.show(); // [如来神掌, 易筋经, 道德经]
    }

    @Test
    public void testFactoryBean(){
        ApplicationContext con = new ClassPathXmlApplicationContext("bean3.xml");
        Course course = con.getBean("myBean", Course.class);
        System.out.println(course); // Course{CourseName='Spring 5'}
    }

    @Test
    public void testBeanLive(){
        ApplicationContext con =
                new ClassPathXmlApplicationContext("bean4.xml");
        Orders orders = con.getBean("orders", Orders.class);
        System.out.println("第四步，获取创建 bean 实例对象");
        System.out.println(orders);
        // 手动让 bean 实例销毁
        ((ClassPathXmlApplicationContext) con).close();
        /**
         * 第一步，调用无参构造方法，创建 bean 实例
         * 第二步，调用 set 方法，设置属性值
         * 第三步，执行初始化的方法
         * 第四步，获取创建 bean 实例对象
         * top.lingchen.spring5.bean.Orders@543c6f6d
         * 第五步，执行销毁的方法
         */

        /** 重新运行上述测试方法，可以得到添加后置处理器后的输出信息：
         * 第一步，调用无参构造方法，创建 bean 实例
         * 第二步，调用 set 方法，设置属性值
         * 在初始化之前执行的方法
         * 第三步，执行初始化的方法
         * 在初始化之后执行的方法
         * 第四步，获取创建 bean 实例对象
         * top.lingchen.spring5.bean.Orders@7403c468
         * 第五步，执行销毁的方法
         */

    }

    @Test
    public void test(){
        ApplicationContext con =
                new ClassPathXmlApplicationContext("bean5.xml");
        Emp emp = con.getBean("emp", Emp.class);
        System.out.println(emp); // Emp{dept=Dept{}}
    }

}
